<?php

namespace app\admin\controller;

use think\Db;
use think\Validate;

// 附件
class Annex extends Auth
{
    // 载入页面
    public function annex()
    {
        // 查询学科
        $course = DB::table('v1_course')->order('v1_course.course_id desc')->select();
        // 查询作业
        // $task = DB::table('v1_task')->order('v1_task.task_id desc')->select();
        // 页面赋值
        $this->assign('course', $course);
        // $this->assign('task', $task);
        // 返回视图页面
        return view("/page/annex");
    }

    // 获取作业提交列表
    public function getList()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 2) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            // 是否传入学科ID
            if ($request->has('courseId', 'get') && $request->get('courseId') != '') {
                // 根据学科ID条件查询
                $info['where']['v1_task_record.course_id'] = ['=', $request->get('courseId')];
            }
            // 是否传入作业
            if ($request->has('taskId', 'get') && $request->get('taskId') != '') {
                // 根据作业ID条件查询
                $info['where']['v1_task_record.task_id'] = ['=', $request->get('taskId')];
            }
            // 查询作业状态
            if ($request->has('state', 'get') && ($request->get('state') != '' && $request->get('state') != 'all')) {
                // 根据作业ID条件查询
                $info['where']['v1_task_record.task_record_state'] = ['=', $request->get('state')];
            }
            // 操作表
            $info['table'] = 'v1_task_record';
            // 别名处理
            $field  = '
            v1_task_record.*,
            v1_student.student_name,
            v1_course.course_name,
            v1_task.task_name,
            v1_task.task_due_date,
            v1_task_annex.task_annex_id,v1_task_annex.task_annex_ext';
            // 设置别名
            $info['field'] = $field;
            // 是否不分页获取全部数据
            if (!$request->has('list', 'get') && $request->get('list') != 'all') {
                // 分页
                $info['limit'] = $this->getPageing();
            }
            // 排序
            $info['order'] = "v1_task_record.course_id desc";
            // 链表
            $info['join'] = [
                ["v1_student", "v1_task_record.student_id=v1_student.student_id"],
                ["v1_course", "v1_task_record.course_id=v1_course.course_id"],
                ["v1_task", "v1_task_record.task_id=v1_task.task_id"],
                ["v1_task_annex", "v1_task_record.task_record_id=v1_task_annex.task_record_id", 'left'],
            ];
            // 查询数据
            return $this->queryList($info);
        } catch (\Exception $e) {
            // 返回空数据
            return json($this->initEmptyData());
        }
    }

    // 作业打包
    public function taskPack()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 2) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            $time = time();
            // 查询学科
            $course = DB::table('v1_course')->where('course_id', $request->post('courseId'))->find();
            // 查询学科
            if (!$course) {
                return json($this->initTips(400, "不存在的学科", ''));
            }
            // 查询历史作业
            $pack = DB::table('v1_pack')->where('course_id', $request->post('courseId'))->where('task_id', $request->post('taskId'))->find();
            // 获取压缩文件清单
            $fileList = file_list(ASSET . $course['course_path'] . "/" . $request->post('taskId'));
            // 下载文件名称
            $_filename = date('YmdHis', $time) . '.zip';
            // 打包文件路径
            $filename = ZIPPATH . $_filename;
            // 如果复制空压缩包成功则加入压缩文件
            if (copyFile(EXTEND . '/pack.zip', $filename)) {
                // 实例化压缩类
                $zip = new \ZipArchive();
                // 打开压缩包
                if ($zip->open($filename, \ZipArchive::CREATE)) {
                    foreach ($fileList as $file) {
                        //向压缩包中添加文件
                        $zip->addFile($file, basename($file));
                    }
                    //关闭压缩包
                    $zip->close();
                } else {
                    return json($this->initTips(500, "打包失败"));
                }
            } else {
                return json($this->initTips(500, "打包创建失败"));
            }

            if (!$pack) {
                // 设置打包信息
                $data = [
                    'pack_file_path' => $_filename,
                    'course_id' => $request->post('courseId'),
                    'task_id' => $request->post('taskId'),
                    'pack_down_key' => md5($time)
                ];
                //记录打包信息
                $res = DB::table('v1_pack')->insertGetId($data);
            } else {
                // 设置打包信息
                $data = [
                    'pack_file_path' => $_filename,
                    'pack_down_key' => md5($time)
                ];
                $res = DB::table('v1_pack')->where('pack_id', $pack['pack_id'])->update($data);
                if ($res) {
                    $res = $pack['pack_id'];
                }
            }

            if ($res) {
                $downUrl = $request->root(true) . '/down/asset/' . $res . ".zip?key=" . md5($time);
                return json($this->initTips(200, "打包成功", $downUrl));
            } else {
                return json($this->initTips(204, "记录保存失败", ''));
            }
        } catch (\Exception $e) {
            // 返回空数据
            return json($this->initTips(500, "服务器内部错误", ''));
        }
    }
}
